package main

import (
	"fmt"
)

/**
func1,func2:
	func2:高阶函数，接收一个函数作为参数的函数,叫做高阶函数,oper
	func1:做为另一个函数的参数的函数，叫做回调函数,fun。回调函数执行时机取决与什么时候调用

*/

func main() {
	fmt.Printf("add:%T\n", add)
	fmt.Printf("oper:%T\n", oper)

	//[01]，传入具体函数
	res1 := oper(10, 20, add)
	fmt.Println("res1", res1) // 30

	//[02] 传入匿名函数变量
	fun1 := func(a, b int) int {
		return a * b
	}
	res2 := oper(4, 10, fun1)
	fmt.Println("res2", res2)

	//[03] 直接传匿名函数
	res3 := oper(10, 2, func(int, int) int {
		return 10 / 2
	})
	fmt.Println("res3", res3)

}

func add(a, b int) int {
	return a + b
}

func oper(a, b int, fun func(int, int) int) int {
	fmt.Println(a, b, fun)
	res := fun(a, b)
	return res
}
